/* 简单来说，Service 就是在复杂业务场景下用于做业务逻辑封装的一个抽象层，提供这个抽象有以下几个好处：
 * 保持 Controller 中的逻辑更加简洁。
 * 保持业务逻辑的独立性，抽象出来的 Service 可以被多个 Controller 重复调用。
 * 将逻辑和展现分离 
*/
module.exports = app => {
  class NewsService extends app.Service {
    * list(page = 1) {
      // 读取配置
      const { serverUrl, pageSize } = this.app.config.news;
      // 使用内置HTTP客户端 GET hacker-news api
      const { data: idList } = yield this.ctx.curl(`${serverUrl}/topstories.json`, {
        data: {
          orderBy: '"$key"',
          startAt: `"${pageSize * (page - 1)}"`,
          endAt: `"${pageSize * page - 1}"`,
        },
        dataType: 'json',
      });
      // 并行获取详细, see `yield {}` from co
      const newsList = yield Object.keys(idList).map(key => {
        const url = `${serverUrl}/item/${idList[key]}.json`;
        return this.ctx.curl(url, { dataType: 'json' });
      });
      return newsList.map(res => res.data);
    }
  }
  return NewsService;
};